#coding:utf8
from rest_framework import serializers
from django_redis import get_redis_connection

import logging

logger = logging.getLogger('meiduo')

#
# serializers.ModelSerializer
# serializers.Serializer
# 我的校验 不需要入库 ,也没有对应的模型
class RegisterSmsCodeSerializer(serializers.Serializer):
    # text = xxxx & image_code_id = xxxx

    # required=True   反序列化的时候必须输入 ,默认 required 就是True
    # write_only=True 反序列化的时候 必须输入
    text = serializers.CharField(label='图片验证码',max_length=4,min_length=4,
                                 write_only=True)

    image_code_id = serializers.UUIDField(label='uuid')


    # 验证的四种方式, 字段类型, 字段选项, 单个字段验证, 多个字段验证

    def validate(self, attrs):

        #1. 获取用户提交的验证码
        text = attrs.get('text')
        image_code_id = attrs['image_code_id']

        # 2. 获取redis的验证码
        redis_conn = get_redis_connection('code')

        redis_code = redis_conn.get('img_%s'%image_code_id)

        # 判断 redis_code 是否存在
        if redis_code is None:
            raise serializers.ValidationError('验证码过期')

        # 获取了图片验证码之后,需要将 redis中的记录删除
        try:
            redis_conn.delete('img_%s'%image_code_id)
        except Exception as e:
            # 记录异常
            logger.error(e)


        # 3. 比较
        # redis的数据获取之后是 bytes类型
        # 都转换为小写
        if redis_code.decode().lower() != text.lower():
            raise serializers.ValidationError('输入不一致')

        return attrs